package com.xrit.sunnyday.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.StringUtil;
import com.xrit.sunnyday.constant.MessageConstant;
import com.xrit.sunnyday.dao.UserDao;
import com.xrit.sunnyday.entity.PageResult;
import com.xrit.sunnyday.entity.QueryPageBean;
import com.xrit.sunnyday.exception.SunnydayException;
import com.xrit.sunnyday.pojo.CheckGroup;
import com.xrit.sunnyday.pojo.CheckItem;
import com.xrit.sunnyday.pojo.Role;
import com.xrit.sunnyday.pojo.User;
import com.xrit.sunnyday.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.method.P;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户管理
 */
@Service(interfaceClass = UserService.class)
public class UserServiecImpl implements UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 用户条件分页查询
     *
     * @param queryPageBean
     * @return
     * 1 使用静态方法，pageheleper
     * 2 紧接着的查询语句会被分页
     * 3 Page 是pageHelper对象, 分页信息
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {

        // 拼接%
        if (!StringUtil.isEmpty(queryPageBean.getQueryString())) {
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }

        // 使用静态方法，pageheleper
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        // 紧接着的查询语句会被分页
        // Page 是pageHelper对象, 分页信息
        List<User> list = userDao.findAll(queryPageBean.getQueryString());

        PageInfo<User> pageInfo = new PageInfo<>(list);
        // 包装到PageResult 再返回
        // 1 解耦
        // 2 total是基本类型，丢失。
        // 3 page对象内容过多 total,rows
        return new PageResult(pageInfo.getTotal(), pageInfo.getList());
    }

    /**
     * 查询所有角色
     *
     * @return
     */
    @Override
    public List<Role> findAllRole() {
        List<Role> roleList = userDao.findAllRole();
        return roleList;
    }

    /**
     * 添加用户
     *
     * @param user
     */
    @Override
    @Transactional
    public void add(User user, Integer[] roleIds) {
        //添加用户
        userDao.add(user);
        //获取用户id
        Integer userId = user.getId();

        // 遍历用户id, 添加用户与角色的关系
        if (null != roleIds) {
            // 有钩选
            for (Integer roleId : roleIds) {
                userDao.addUserRole(userId, roleId);
            }
        }
    }

    /**
     * 删除用户
     *
     * @param id
     */
    @Override
    public void deleteById(int id) throws SunnydayException {
        //1. 查询是否存在关系
        int count = userDao.findUserRole(id);

        //2. 判断
        if (count > 0) {
            throw new SunnydayException(MessageConstant.CHECKITEM_IN_USER);
        }
        //3. 删除用户
        userDao.deleteById(id);
    }

    /**
     * 通过id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User findById(int id) {
        return userDao.findById(id);
    }

    /**
     * 通过用户id选中角色id
     *
     * @param userId
     * @return
     */
    @Override
    public List<Integer> findRoleIdByUserId(Integer userId) {
        return userDao.findRoleIdByUserId(userId);
    }

    /**
     * 编辑用户
     *
     * @param user
     * @param roleIds
     */
    @Override
    public void update(User user, Integer[] roleIds) {
        //1.先修改用户
        userDao.update(user);
        //2.再解除关系
        userDao.deleteUserRole(user.getId());
        //3.建立新关系
        //遍历用户id，添加用户与角色的关系
        if (null != roleIds){
            //有勾选
            for (Integer roleId : roleIds) {
                userDao.addUserRole(user.getId(),roleId);
            }
        }
    }

    /**
     * 根据登录用户名称查询用户权限信息
     */
    @Override
    public User findByUsername(String username) {
        return userDao.findByUsername(username);
    }

}
